const myApply = function (context = window, args) {
  // 如果context是undefined或null，则使用全局对象
  if (context === undefined || context === null) {
    context = window;
  }
  // 为context创建一个唯一的属性名，避免覆盖已有属性
  const fnSymbol = Symbol("fn");
  // 将当前函数（this）作为context的方法
  context[fnSymbol] = this;
  // 执行函数并传入参数
  const result = context[fnSymbol](...args);
  // 删除临时添加的方法
  delete context[fnSymbol];
  // 返回函数执行结果
  return result;
};

const myCall = function (context = window, ...args) {
  // 如果context是undefined或null，则使用全局对象
  if (context === undefined || context === null) {
    context = window;
  }
  // 为context创建一个唯一的属性名，避免覆盖已有属性
  const fnSymbol = Symbol("fn");
  // 将当前函数（this）作为context的方法
  context[fnSymbol] = this;
  // 执行函数并传入参数
  const result = context[fnSymbol](...args);
  // 删除临时添加的方法
  delete context[fnSymbol];
  // 返回函数执行结果
  return result;
};

// 将myApply方法添加到Function原型上
Function.prototype.myApply = myApply;
Function.prototype.myCall = myCall;

// 测试用例
const obj = {
  name: "张三",
};

function greet(age, city) {
  console.log(`我叫${this.name}，今年${age}岁，来自${city}`);
}

greet.apply(obj, [18, "北京"]); // 输出：我叫张三，今年18岁，来自北京
greet.myApply(obj, [18, "北京"]); // 输出：我叫张三，今年18岁，来自北京
greet.myCall(obj, 18, "Beijing"); // 输出：我叫张三，今年18岁，来自北京
